package com.xiaoniu.forum.web.controller.app;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaoniu.forum.annotation.Login;
import com.xiaoniu.forum.annotation.LoginUser;
import com.xiaoniu.forum.common.constant.ForumConstant;
import com.xiaoniu.forum.common.utils.*;
import com.xiaoniu.forum.entity.MemberEntity;
import com.xiaoniu.forum.entity.MemberMessageEntity;

import com.xiaoniu.forum.entity.dto.QueryDTO;
import com.xiaoniu.forum.entity.vo.Dialogue;
import com.xiaoniu.forum.service.MemberMessageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 查询发送给用户的消息、通知的接口
 */
@RestController
@RequestMapping("/app/message")
@Api("APP消息接口")
public class AppMessagConroller {
    @Autowired
    private MemberMessageService messageService;

    /**
     * 如何刷新 与用户相关的对话列表呢？
     * 1、每隔2-3秒刷新一次（效率低）
     *
     * 2、每次保存一条消息，就通过websocket告诉这条消息相关的两个用户
     *    然后他们接收到通知后，就可以去拉取最新的对话列表了
     */
    /**
     * 查询用户的对话列表
     * @param lastMessageTime  前端要将用户最后一条消息的时间带来，和数据库用户最新的一条消息比较
     *                         如果小于数据库最新的一条消息的时间，则返回新的对话列表，否则不返回数据
     *                         不带最后一条消息的时间，也视为需要新的对话列表
     * @return
     */
    @ApiOperation("查询用户的对话列表")
    @Login
    @PostMapping("/dialogue/list")
    public R dialogueList(@LoginUser MemberEntity member, Date lastMessageTime) throws Exception {
        if (lastMessageTime != null){
            MemberMessageEntity message = messageService.getLastMessage(member.getId());
            if (message == null || DateUtils.compareTime(lastMessageTime,message.getCreateTime()) <= 0){
                //如果用户没有最新一条消息，或者最新一条消息的时间小于等于前端带来的时间，则无需返回数据
                return R.ok();
            }else { //否则，返回新列表
                List<Dialogue> dialogues = messageService.dialogueList(member.getId());
                return R.ok().put("data",dialogues);
            }
        }
        return R.ok().put("data",messageService.dialogueList(member.getId()));//不带最后一条消息的时间，也视为需要新的对话列表
    }


    /**
     * 查询与某位用户的聊天记录，分页查询
     * (根据消息创建时间倒序查询)
     */
    @ApiOperation("查询与某位用户的聊天记录，分页查询")
    @Login
    @PostMapping("/history/list/{anotherUserId}")
    public R historyList(@LoginUser MemberEntity member,
                         @PathVariable String anotherUserId,
                         @RequestBody QueryDTO queryDTO) throws Exception {

        //Integer[] excludeTypes = {ForumConstant.FOLLOW_ACTION,ForumConstant.LIKE_ACTION,ForumConstant.REPLY_ACTION};
        PageUtils pageUtils = messageService.historyList(member.getId(),anotherUserId,queryDTO);
        return R.ok().put("page",pageUtils);
    }



    /**
     * 查询历史消息，根据"消息类型"查询，根据消息创建时间倒序查询
     * （主要供系统类消息查询使用的接口，如回复、关注、点赞等消息，非系统类消息查询不要使用该接口查询）
     */
    @ApiOperation("查询用户的消息，按消息类型查询，分页查询")
    @Login
    @PostMapping("/historyByType/{type}")
    public R historyListByType(@LoginUser MemberEntity member,
                         @PathVariable Integer type,
                         @RequestBody QueryDTO queryDTO) throws Exception {
        PageUtils pageUtils = messageService.historyListByType(member.getId(),type,queryDTO.getCurrentPage(),queryDTO.getSize());
        return R.ok().put("page",pageUtils);
    }

    /**
     * 根据消息类型查询未读记录数
     */
    @ApiOperation("根据消息类型查询未读记录数")
    @Login
    @GetMapping("/unread/{type}")
    public R QueryUnreadByType(@LoginUser MemberEntity member,
                                @PathVariable Integer type){
        QueryWrapper<MemberMessageEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("recipient_id",member.getId());
        queryWrapper.eq("type",type);
        queryWrapper.eq("is_read",ForumConstant.FALSE);
        int count = messageService.count(queryWrapper);
        return R.ok().put("unreadCount",count);
    }

    /**
     * 查询用户的总共未读记录数
     */


}
